package com.clx.admin.controller;

import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;

import com.clx.admin.service.UserService;
import com.clx.common.controller.BaseController;
import com.clx.common.domain.dto.UpdateUserDto;
import com.clx.common.domain.entity.DiskUser;
import com.clx.common.domain.vo.AjaxResult;
import com.clx.common.domain.vo.TableDataInfo;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import com.clx.common.utils.PasswordUtil;
import com.clx.common.utils.StringUtils;

import java.util.List;

/**
 * 用户表(User)表控制层
 *
 * @author clx
 * @since 2025-01-09 19:15:48
 */
@RestController
@RequestMapping("user")
@RequiredArgsConstructor
public class UserController extends BaseController {
    /**
     * 依赖注入
     */
    private final UserService userService;

    /**
     * 查询列表
     */
    
    @GetMapping("/list")
    public TableDataInfo list(DiskUser user) {

        List<DiskUser> list = userService.selectUserList(user);
        return getDataTable(list);
    }

    /**
     * 获取详细信息
     */
    @GetMapping("/{id}")
    public AjaxResult getInfo(@PathVariable("id") Long id) {
        return success(userService.selectUserById(id));
    }

    /**
     * 新增数据
     */
    @PostMapping
    public AjaxResult add(@RequestBody DiskUser user) {
        return toAjax(userService.insertUser(user));
    }

    /**
     * 修改数据
     */
    @PutMapping
    public AjaxResult edit(@RequestBody DiskUser user) {
        return toAjax(userService.updateUser(user));
    }

    /**
     * 删除数据
     */
    @DeleteMapping("/{ids}")
    public AjaxResult remove(@PathVariable Long[] ids) {
        return toAjax(userService.deleteUserByIds(ids));
    }

    /**
     * 用户登录
     */
    @PostMapping("/login")
    public AjaxResult login(@RequestBody DiskUser user) {
        try {
            //通过用户名查找
            DiskUser tempUser = userService.selectByUser(user);

            if (ObjectUtils.isEmpty(tempUser)){
                return AjaxResult.error("用户名或密码不正确");
            }
            //校验  先解密
            boolean matches = PasswordUtil.matches(user.getPassword(), tempUser.getPassword());
            if (!matches){
                return AjaxResult.error("用户名或密码不正确");
            }
            if (StringUtils.equals(tempUser.getUsername(), user.getUsername())) {
                //登录成功
                StpUtil.login(tempUser.getId());
                //获取生成的tokeninfo
                SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
                return AjaxResult.success("登录成功",tokenInfo);
            } else {
                //用户名或密码不正确
                return AjaxResult.error("用户名或密码不正确");
            }
        }catch (Exception e){
            logger.info("登录接口：{}",e);
            return AjaxResult.error("服务器异常,请稍后再试");
        }
    }

    /**
     * 用户注册
     * @param user
     * @return
     */
    @PostMapping("/register")
    public AjaxResult register(@RequestBody DiskUser user ){
        //拿到注册信息,检查邮箱，用户名是否唯一
        List<DiskUser> users = userService.selectUserList(user);
        //校验
        if (users.isEmpty()){
            //可以注册
            //对用户密码进行加密
            String newPassword = PasswordUtil.encodePassword(user.getPassword());
            user.setPassword(newPassword);
            int i = userService.insertUser(user);
            if (i<0){
                return AjaxResult.error("注册失败");
            }else {
                return AjaxResult.success("注册成功");
            }
        }else {
            //不可以注册
            if (StringUtils.equals(users.get(0).getUsername(),user.getUsername())){
                return AjaxResult.error("用户名已经被注册");
            }else if (StringUtils.equals(users.get(0).getEmail(),user.getEmail())){
                return AjaxResult.error("邮箱已经被注册");
            }
        }
        return AjaxResult.error("服务器异常,请联系管理员");
    }

    /**
     * 退出登录
     * @param
     * @return
     */
    @GetMapping("/logout")
    public SaResult logout() {
        // 当前会话注销登录
        StpUtil.logout();
        return SaResult.get(SaResult.CODE_SUCCESS, "退出成功", null);
    }


    /**
     * 根据用户id搜索用户
     */
    @GetMapping("/contract")
    public SaResult contract(@RequestParam("searchValue") String searchValue) {

        return SaResult.get(SaResult.CODE_SUCCESS, "退出成功", null);
    }


    /**
     * 根据用户id返回用户信息
     */
    @GetMapping("/all")
    public AjaxResult all(@RequestParam Long userId){
        return userService.all(userId);
    }


    /**
     * 上传用户头像
     * @param file
     * @return
     */
    @PostMapping("/uploadAvatar")
    public SaResult uploadAvatar( MultipartFile file) {
        String avatarUrl = userService.uploadAvatar(file);
        if (StringUtils.isNull(avatarUrl)){
            return null;
        }
        return SaResult.get(SaResult.CODE_SUCCESS, "预览地址返回成功", avatarUrl);
    }

    /**
     * 修改个人资料
     */
    @PostMapping("/updateUser")
    public AjaxResult updateUserDto(@RequestBody UpdateUserDto updateUserDto){
        return userService.updateUserDto(updateUserDto);
    }
}
